//
//  WJTopicViewController.m
//  BeDeJie
//
//  Created by jerry on 2017/1/30.
//  Copyright © 2017年 jerry. All rights reserved.
//

#import "WJTopicViewController.h"
#import <MJRefresh/MJRefresh.h>
#import <AFNetworking/AFNetworking.h>
#import <MJExtension/MJExtension.h>
#import <SVProgressHUD/SVProgressHUD.h>
#import "WJTopic.h"
#import "WJTopicCell.h"
#import <SDImageCache.h>

/* cell的重用标识 */
static NSString * const topicCellId = @"topicCellId";

@interface WJTopicViewController ()

//当前最后一条数据的标识，专门用来加载下一页的数据
@property (nonatomic,copy) NSString *maxtime;
//所有帖子的数据
@property (nonatomic,strong) NSMutableArray<WJTopic *>  *topics;
//请求管理者
@property (nonatomic,strong) AFHTTPSessionManager *manager;

@end

@implementation WJTopicViewController

//懒加载管理器
-(AFHTTPSessionManager *) manager {
    if (!_manager) {
        _manager = [AFHTTPSessionManager manager];
    }
    return _manager;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //设置背景色
    self.view.backgroundColor = WJColor(206, 206, 206);
    
    //设置刷新控件
    [self setupRefresh];
    
    //设置UITableView的内边距，用来实现tableView的穿透效果
    self.tableView.contentInset = UIEdgeInsetsMake(WJNavMaxY + WJTitleViewHeight, 0, WJTabBarHeight, 0);
    self.tableView.scrollIndicatorInsets = self.tableView.contentInset;
    //取消分隔线
    self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    
    // 设置cell的估算高度（每一行大约都是estimatedRowHeight）
    // 有了估算高度，先调用cellForRowAtIndexPath，再调用heightForRowAtIndexPath，如果没有，先调用heightForRowAtIndexPath，再调用cellForRowAtIndexPath
    //    self.tableView.estimatedRowHeight = 100;
    
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tabBarButtonDidRepeatClick) name:WJTabBarButtonDidRepeatClickNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(titleButtonDidRepeatClick) name:WJTitleButtonDidRepeatClickNotification object:nil];
    
    // 注册cell
    UINib *nib = [UINib nibWithNibName:NSStringFromClass([WJTopicCell class]) bundle:nil];
    [self.tableView registerNib:nib forCellReuseIdentifier:topicCellId];
    
}

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

#pragma mark - 监听
// 监听tabBarButton重复点击
- (void)tabBarButtonDidRepeatClick {
    // 如果重复点击的不是精华按钮，则返回
    if (self.view.window == nil) return;
    
    // 如果显示在正中间的不是TopicViewController，则返回
    if (self.tableView.scrollsToTop == NO) return;
    
    // 进入下拉刷新
    [self.tableView.mj_header beginRefreshing];
}

// 监听titleButton重复点击
- (void)titleButtonDidRepeatClick{
    [self tabBarButtonDidRepeatClick];
}

/** 在这里实现type方法，仅仅是为了消除警告 */
- (WJTopicType)type {
    return 0;
}

//设置刷新控件
-(void) setupRefresh {
    // 广告条
    UILabel *label = [[UILabel alloc] init];
    label.backgroundColor = [UIColor blackColor];
    label.frame = CGRectMake(0, 0, 0, 30);
    label.textColor = [UIColor whiteColor];
    label.text = @"广告";
    label.textAlignment = NSTextAlignmentCenter;
    self.tableView.tableHeaderView = label;
    
    //头部的刷新视图
    MJRefreshNormalHeader *headerView = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewData)];
    //底部的刷新视图
    MJRefreshAutoNormalFooter *footerView = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
    // 设置自动切换透明度(在导航栏下面自动隐藏)
    headerView.automaticallyChangeAlpha = YES;
    self.tableView.mj_header = headerView;
    self.tableView.mj_footer = footerView;
    
    //一进入就开始加载顶部数据
    [headerView beginRefreshing];
}

//如果底部正在加载数据，则可以取消加载数据的请求
-(void) cancelLoadMoreDataAndEndFooterRefreshing {
    //取消所有的请求，并关闭session(注意：一旦关闭session,这个manager再也无法发送任何请求)
    //[self.manager invalidateSessionCancelingTasks:YES];
    
    //取消上一次的请求
    [self.manager.tasks makeObjectsPerformSelector:@selector(cancel)];
    //结束刷新
    [self.tableView.mj_footer endRefreshing];
}

//向服务器请求最新数据
-(void) loadNewData {
    //1. 取消之前的请求
    [self cancelLoadMoreDataAndEndFooterRefreshing];
    
    //2. 拼接参数
    NSMutableDictionary *params = [NSMutableDictionary dictionary];
    params[@"a"] = @"list";
    params[@"c"] = @"data";
    params[@"type"] = @(self.type);
    
    //3. 发送请求
    [self.manager GET:@"http://api.budejie.com/api/api_open.php" parameters:params progress:nil
              success:^(NSURLSessionDataTask *task, NSDictionary *responseObject) {
                  //存储maxtime
                  self.maxtime = responseObject[@"info"][@"maxtime"];
                  //字典数据转模型数据
                  self.topics = [WJTopic mj_objectArrayWithKeyValuesArray:responseObject[@"list"]];
                  
                  //如果下拉时，也使用追加方式，可以使用以下的代码
                  //                  NSMutableArray *newTopics = [WJTopic mj_objectArrayWithKeyValuesArray:responseObject[@"list"]];
                  //                  if (self.topics) {
                  //                      [self.topics insertObjects:newTopics atIndexes:[NSIndexSet indexSetWithIndex:0]];
                  //                  } else {
                  //                      self.topics = newTopics;
                  //                  }
                  
                  //刷新表格
                  [self.tableView reloadData];
                  //结束刷新
                  [self.tableView.mj_header endRefreshing];
              }failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
                  //如果是取消之前的请求数据，则请求的结果在此处提示。
                  //如果错误并非是取消任务导致的error，而是其他网络问题导致的error，则弹出错误提示
                  if (error.code != NSURLErrorCancelled) {
                      [SVProgressHUD showErrorWithStatus:@"网络繁忙，请稍后再试！"];
                  }
                  // 结束刷新
                  [self.tableView.mj_header endRefreshing];
              }];
}

//如果顶部正在加载数据，则可以取消加载数据的请求
-(void) cancelLoadNewDataAndEndHeaderRefreshing {
    //取消上一次的请求
    [self.manager.tasks makeObjectsPerformSelector:@selector(cancel)];
    //结束刷新
    [self.tableView.mj_header endRefreshing];
}

//向服务器请求加载更多数据
-(void) loadMoreData {
    //1. 取消之前的请求
    [self cancelLoadNewDataAndEndHeaderRefreshing];
    
    //2. 拼接参数
    NSMutableDictionary *params = [NSMutableDictionary dictionary];
    params[@"a"] = @"list";
    params[@"c"] = @"data";
    params[@"type"] = @(self.type);
    params[@"maxtime"] = self.maxtime;
    
    //3. 发送请求
    [self.manager GET:@"http://api.budejie.com/api/api_open.php" parameters:params progress:nil
              success:^(NSURLSessionDataTask *task, NSDictionary *responseObject) {
                  //存储maxtime
                  self.maxtime = responseObject[@"info"][@"maxtime"];
                  //字典数据转模型数据
                  NSArray *moreTopics = [WJTopic mj_objectArrayWithKeyValuesArray:responseObject[@"list"]];
                  //累加到旧数据后面
                  [self.topics addObjectsFromArray:moreTopics];
                  //刷新表格
                  [self.tableView reloadData];
                  //结束刷新
                  [self.tableView.mj_footer endRefreshing];
                  
                  //如果返回的数据个数大于60,则提示没有更多数据
                  if (self.topics.count >= 60) {
                      [self.tableView.mj_footer endRefreshingWithNoMoreData];
                  } else {
                      [self.tableView.mj_footer endRefreshing];
                  }
              } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
                  //如果是取消之前的请求数据，则请求的结果在此处提示。
                  //如果错误并非是取消任务导致的error，而是其他网络问题导致的error，则弹出错误提示
                  if (error.code != NSURLErrorCancelled) {
                      [SVProgressHUD showErrorWithStatus:@"网络繁忙，请稍后再试！"];
                  }
                  // 结束刷新
                  [self.tableView.mj_footer endRefreshing];
              }];
    
    
}

#pragma mark - 数据源
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    //根据内容的数量显示或隐藏footer
    self.tableView.mj_footer.hidden = (self.topics.count == 0);
    
    return self.topics.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    // control + command + 空格 -> 弹出emoji表情键盘
    //    cell.textLabel.text = @"⚠️哈哈";
    
    WJTopicCell *cell = [tableView dequeueReusableCellWithIdentifier:topicCellId];
    cell.topic = self.topics[indexPath.row];
    
    return cell;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    WJTopic *topic = self.topics[indexPath.row];
    return topic.cellHeight;
}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    // 清除内存缓存
    [[SDImageCache sharedImageCache] clearMemory];
    
    // 设置缓存时长为1个月
    // [SDImageCache sharedImageCache].maxCacheAge = 30 * 24 * 60 * 60;
    
    // 清除沙盒中所有使用SD缓存的过期图片（缓存时长 > 一个星期）
    // [[SDImageCache sharedImageCache] cleanDisk];
    
    // 清除沙盒中所有使用SD缓存的图片
    // [[SDImageCache sharedImageCache] clearDisk];
    
}

@end
